package com.interviewbackend.util;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.interviewbackend.entity.InterviewRecord;
import com.interviewbackend.entity.InterviewSession;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class PromptBuilder {

    /**
     * 构造普通提问 Prompt
     */
    public String buildNormalQuestionPrompt(InterviewSession session, String subQuestionContent, List<String> questionHistory) {
        // 获取当前阶段名
        String phaseName = TagUtil.intToTag(session.getRoundIndex());
        String phaseDetails = TagUtil.intToTag_1(session.getRoundIndex());
        String phase = phaseName + phaseDetails;

        StringBuilder sb = new StringBuilder();
        sb.append("你是一个资深的面试官，请根据以下信息为面试者设计一道新的面试题。\n");
        sb.append("请注意：你只需要生成**题目本身**，不要添加编号、解释或格式化修饰。\n\n");

        sb.append("面试者岗位方向：").append(session.getJobType()).append("\n");
        sb.append("面试风格偏好：").append(session.getStyle()).append("\n");
        sb.append("面试难度等级：").append(session.getDifficulty()).append("\n");
        sb.append("简历关键词如下：").append(session.getResumeKeywords()).append("\n");
        sb.append("当前阶段：").append(phase).append("\n\n");

        if (!questionHistory.isEmpty()) {
            sb.append("在本阶段已提问的问题有：").append(String.join("；", questionHistory)).append("。\n");
            sb.append("请避免重复，保持主题一致。\n");
        }

        sb.append("\n请你优先参考下面的子题库内容，根据子题库内容和当下的你收集的最新内容，生成题目，同时要结合面试风格、简历关键词、特别是阶段特征。\n");
        sb.append("子题库内容如下：\n").append(subQuestionContent);

        return sb.toString();
    }

    public String buildSingleEvaluationPrompt(String question, String answer, String evaluationJson) {
        return """
            以下是候选人在一道面试题中的表现：
            
            - 问题：%s
            - 回答：%s
            - 多模态分析结果：%s
            
            请你判断回答是否充分：
            
            - 如果回答充分，只返回“否”，表示无需追问。
            - 如果回答不充分，请返回：
              是，<简要评价>
            
            请严格按照格式返回，不添加其他解释或文字。
            """.formatted(question, answer, evaluationJson);
    }

    /**
     * 构造追问 Prompt
     */
    public String buildFollowUpPrompt(InterviewSession session, InterviewRecord lastRecord) {
        StringBuilder sb = new StringBuilder();

        // 获取当前阶段名
        String phaseName = TagUtil.intToTag(session.getRoundIndex());
        String phaseDetails = TagUtil.intToTag_1(session.getRoundIndex());
        String phase = phaseName + phaseDetails;

        // 开场任务定义
        sb.append("你现在的任务是：基于候选人在上一个问题中的表现，提出一个有针对性的追问问题。\n\n");

        // 候选人上下文信息
        sb.append("候选人信息如下：\n");
        sb.append("- 岗位方向：").append(session.getJobType()).append("\n");
        sb.append("- 面试风格：").append(session.getStyle()).append("\n");
        sb.append("- 面试难度等级：").append(session.getDifficulty()).append("\n");
        sb.append("- 简历关键词：").append(session.getResumeKeywords()).append("\n");
        sb.append("- 当前面试阶段：").append(phase).append("\n\n");

        // 历史对话内容
        sb.append("以下是候选人的上一轮对话内容：\n");
        sb.append("- 原始问题：").append(lastRecord.getQuestionText()).append("\n");
        sb.append("- 回答内容：").append(lastRecord.getAnswerText()).append("\n");
        sb.append("- 多模态行为分析：").append(lastRecord.getEvaluationJson()).append("\n");
        sb.append("- 追问评价：").append(lastRecord.getSuggestion()).append("\n\n");

        // 明确输出要求
        sb.append("请你根据以上所有信息,注意结合阶段特征，提出一个具体、有深度的追问问题，用于进一步考察候选人的能力。\n");
        sb.append("请注意：不要重复原始问题，避免泛泛而谈；**只返回追问问题本身**，不需要任何解释或修饰。");

        return sb.toString();
    }

    public String buildEvaluationPrompt(List<String> questions, List<String> answers, List<String> evaluations) {
        StringBuilder sb = new StringBuilder();
        sb.append("以下是候选人整个面试的记录内容：\n");

        for (int i = 0; i < questions.size(); i++) {
            sb.append("【第").append(i + 1).append("题】\n")
                    .append("问题：").append(questions.get(i)).append("\n")
                    .append("回答：").append(answers.get(i)).append("\n")
                    .append("多模态分析：").append(evaluations.get(i)).append("\n\n");
        }

        sb.append("""
                    请你作为一个专业面试评估系统，对面试者的表现进行多维度分析和评估，输出完整评估报告。
                              
                              【一】维度评分与解释（每项满分 10 分）：
                              请对以下 6 个维度逐项评分，并给出一句简要解释：
                              1. 专业知识水平 \s
                              2. 语言表达能力 \s
                              3. 逻辑思维能力 \s
                              4. 创新能力 \s
                              5. 应变与抗压能力 \s
                              6. 沟通与协作能力 \s
                              
                              每项格式为： \s
                              【维度名】：X / 10 + 简要解释（如：表达清晰、有条理）
                              
                              【二】总体评分与匹配度：
                              - 总体评分（0~100 分） \s
                              - 推荐结论（推荐录用 / 建议复试 / 不推荐） \s
                              - 岗位匹配度（如：87%），用于岗位适配度展示
                              
                              【三】脑认知风格分析：
                              - 脑区编号（1~5） \s
                              - 类型名称（例如：学术型脑区） \s
                              - 分析原因（基于哪些能力得分突出） \s
                              - 典型脑区结构名称（3~5 个）
                              
                              【四】核心能力分析：(请分为以下三段清晰列出：)
                               优势：列出 2~3 个面试者能力或表现中的明显亮点（如框架掌握、表达流畅）
                               需提升：指出哪些能力低于岗位平均分，标出得分与对比参考（如：应变能力 72 分，岗位均值 75 分）
                               风险点：基于行为、回答或认知能力，提出可能导致工作风险的预警
                              
                              【五】典型行为摘录：                            
                              行为摘录：列出面试中1条代表性语言或行为表现，可体现真实水平或性格特征
                              
                              【六】岗位适配建议：
                              - 匹配的岗位要求项（如技术栈、表达能力、协作意识等） \s
                              - 仍需提升的能力项 \s
                              - 是否适应该岗位的开发模式（如敏捷、跨职能合作）
                              
                              【七】发展潜力与培养价值评估：
                              请结合以下维度评估面试者未来的发展潜力：
                              - 学习与适应能力（是否快速上手新任务）\s
                              - 职业目标感（是否表达了清晰方向）\s
                              - 多维成长性（是否具备跨职能发展的基础）\s
                              - 培养建议（如推荐导师制、项目制培养）
                              ---
                              
                              脑认知风格类型参考如下：
                              
                              1. **学术型脑区**（编号：1） \s
                              表现特征：专业知识水平和逻辑思维能力突出 \s
                              典型脑区结构：背外侧前额叶、中额叶回、上额叶回、前扣带皮层 \s
                              
                              2. **语言型脑区**（编号：2） \s
                              表现特征：语言表达与沟通协作能力突出 \s
                              典型脑区结构：布罗卡区、威尔尼克区、听觉皮层 \s
                              
                              3. **创意思维脑区**（编号：3） \s
                              表现特征：创新能力突出 \s
                              典型脑区结构：顶叶联合区、额叶关联区、默认模式网络 \s
                              
                              4. **抗压应变脑区**（编号：4） \s
                              表现特征：应变与抗压能力突出 \s
                              典型脑区结构：前扣带皮层、杏仁核、岛叶皮层 \s
                              
                              5. **协同合作脑区**（编号：5） \s
                              表现特征：沟通与协作能力表现出色 \s
                              典型脑区结构：默认模式网络、dmPFC、颞上沟、岛叶、PCC \s
                              
                              ---
                              
                              【输出格式要求】：
                              
                              - 所有模块须按照编号 1~7 顺序完整输出，模块标题保持一致（如：“【一】维度评分与解释”），便于系统自动解析。
                              - 每个模块之间需空一行，模块内部不需额外空行，保持整体结构紧凑清晰。
                              - 各评分项统一使用格式：“【维度名】：X / 10 + 简要解释”，不得省略评分或解释内容。
                              - “总体评分”使用格式：“总体评分：X / 100”，推荐结论与岗位匹配度在其下独立展示。
                              - “脑认知风格分析”应列明编号、类型名称、分析原因与脑区结构名称列表，保持条理分明。
                              - “核心能力分析”中的三段（优势 / 需提升 / 风险点）应清晰分开，每一段一句话。
                              - 所有建议类内容（岗位建议、发展建议）应使用完整句描述，语言务实，避免空泛表述。
                              - 如某项能力或维度无明显体现，应在该项标明“暂未明显体现”或“无显著信息”，而非跳过。
                              - 所有文字应使用专业、规范、客观的表述风格，避免重复使用“还可以”“有待加强”等泛泛词语。
                      
                              给出的时候不要在每个模块名左右加上*，直接按照如"模块名："给出，风格应简洁、专业、逻辑清晰，符合正式评估报告使用标准。
                """);

        return sb.toString();
    }






}
